package com.grupobbva.seguridad.dao.hibernate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.grupobbva.seguridad.dao.AdministracionDao;
import com.grupobbva.seguridad.domain.Empresa;
import com.grupobbva.seguridad.domain.TablaDetalle;
import com.grupobbva.seguridad.domain.TablaGeneral;
import com.grupobbva.seguridad.domain.TipoOficina;
import com.grupobbva.seguridad.domain.Ubicacion;
import com.grupobbva.seguridad.util.Constante;

@Repository
public class AdministracionDaoImpl extends HibernateDaoSupport implements AdministracionDao {
    
	private static final Logger log=Logger.getLogger(AdministracionDaoImpl.class);
	
	
    @Autowired
	public AdministracionDaoImpl(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}
    
	public List<TablaDetalle> obtenerDetalles(Long tablaId) throws Exception {
		log.info("Ingreso a obtenerDetalles "+tablaId);
		List<TablaDetalle> detalles = getSession().createQuery("Select o from TablaDetalle o where o.activo = 1 and o.tablaGeneral.tablaId = :tablaId").setParameter("tablaId", tablaId).list();
		return detalles;
	}

	public List<TablaGeneral> obtenerTablas() throws Exception {
		log.info("Ingreso a obtenerTablas ");
		return getSession().createQuery("Select o from TablaGeneral o where o.activo = 1").list();
	}

	/* (non-Javadoc)
	 * @see com.grupobbva.seguridad.dao.AdministracionDao#obtenerListadoEmpresas()
	 * @creado por wbardalez 18-11-2013
	 */
	@Override
	public List<Empresa> obtenerListadoEmpresas() throws Exception {
		log.info("Ingreso a obtenerListadoEmpresas ");
		Connection cnn = null;
		PreparedStatement stm = null;
		ResultSet rst = null;
		List<Empresa> lstEmpresas = null;
		try {
			//Establecer conexion con el LDAP
			cnn = com.grupobbva.seguridad.util.Conexion.getConnection(Constante.JNDI_IIWX);
			String sql = " select distinct (CODEMP), DESEMP from ldapperu2 order by CODEMP ";
	
			stm = cnn.prepareStatement(sql);
			rst = stm.executeQuery();
			
			lstEmpresas = new ArrayList<Empresa>();
			
			while (rst.next()) {
				Empresa empresa = new Empresa();
				empresa.setCodEmpresa(rst.getString(1));
				empresa.setNombreEmpresa(rst.getString(2));
				lstEmpresas.add(empresa);
			}
			
			
			
		} catch (Exception e) {
			log.error(e.getMessage(),e);
		} finally {
			com.grupobbva.seguridad.util.Conexion.close(cnn, stm, rst);
		}
		return lstEmpresas;
	}

	/* (non-Javadoc)
	 * @see com.grupobbva.seguridad.dao.AdministracionDao#obtenerListadoOficinas()
	 * @creado por wbardalez 20-11-2013
	 */
	@Override
	public List<TipoOficina> obtenerListadoOficinas(Long parameterLong) throws Exception {
		log.info("Ingreso a obtenerListadoOficinas ");
		Connection cnn = null;
		PreparedStatement stm = null;
		ResultSet rst = null;
		List<TipoOficina> lstOficinas = null;
		try {
			//Establecer conexion con el LDAP
			cnn = com.grupobbva.seguridad.util.Conexion.getConnection(Constante.JNDI_IIWX);
			String codigoEmpresa = completarCodigo(parameterLong);
			String sql = " select distinct(Usofut5) from ldapperu2 where codemp="+codigoEmpresa+ "and Usofut5 is not null";
			stm = cnn.prepareStatement(sql);
			rst = stm.executeQuery();
			
			lstOficinas = new ArrayList<TipoOficina>();
			
			while (rst.next()) {
				TipoOficina tipoOficina = new TipoOficina();
				tipoOficina.setCodTipoOficina(rst.getString(1));
				lstOficinas.add(tipoOficina);
			}
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			com.grupobbva.seguridad.util.Conexion.close(cnn, stm, rst);
		}
		return lstOficinas;
	}

	private String completarCodigo(Long parameterLong) {
		log.info("Ingreso a completarCodigo "+parameterLong);
		// TODO Auto-generated method stub
		String codigoEmpresa = ""+parameterLong;
		String aux="0";
		while(codigoEmpresa.length()<4){
			codigoEmpresa=aux.concat(codigoEmpresa);
		}
		return codigoEmpresa;
	}

	/* (non-Javadoc)
	 * @see com.grupobbva.seguridad.dao.AdministracionDao#obtenerListadoUbicacion()
	 * @creado por wbardalez 20-11-2013
	 */
	@Override
	public List<Ubicacion> obtenerListadoUbicacion(Long parameterLong) throws Exception {
		log.info("Ingreso a obtenerListadoUbicacion "+parameterLong);
		Connection cnn = null;
		PreparedStatement stm = null;
		ResultSet rst = null;
		List<Ubicacion> lstUbicacion = null;
		try {
			//Establecer conexion con el LDAP
			cnn = com.grupobbva.seguridad.util.Conexion.getConnection(Constante.JNDI_IIWX);
			String codigoEmpresa = completarCodigo(parameterLong);
			String sql = " select distinct(Usofut4) from ldapperu2 where codemp="+codigoEmpresa + "and Usofut4 is not null";;
	
			stm = cnn.prepareStatement(sql);
			rst = stm.executeQuery();
			
			lstUbicacion = new ArrayList<Ubicacion>();
			
			while (rst.next()) {
				Ubicacion ubicacion = new Ubicacion();
				ubicacion.setCodUbicacion(rst.getString(1));
				lstUbicacion.add(ubicacion);
			}
			
			
			
		} catch (Exception e) {
			log.error(e.getMessage(),e);
		} finally {
			com.grupobbva.seguridad.util.Conexion.close(cnn, stm, rst);
		}
		return lstUbicacion;
	}

}
